page.tsx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. 'use server';
  2. import './style.scss';
  3. import View from './view';
  4. import { notFound, forbidden, redirect } from 'next/navigation';
  5. import { BoardLayout, BoardSort, PostSearchType } from '@/constants/forum';
  6. import BoardPostsRequest from '@/dtos/request/forum/board/postListRequest';
  7. import { isAuthenticated } from '@/lib/api/auth';
  8. import { fetchBoard, fetchPostList } from '@/lib/api/forum/board';
  9. import { throwError, checkPermission } from '@/lib/utils/server';
  10. import PermissionDenied from '../_component/PermissionDenied';
  11. type Props = {
  12. params: Promise<{
  13. code: string;
  14. }>;
  15. searchParams: Promise<{
  16. page: number;
  17. perPage: number;
  18. prefix?: number;
  19. sort?: BoardSort;
  20. search: PostSearchType;
  21. keyword?: string;
  22. }>;
  23. }
  24. export default async function Board({ params, searchParams }: Props)
  25. {
  26. const { code } = await params;
  27. if (!code) {
  28. return notFound();
  29. }
  30. const query = await searchParams;
  31. // 게시판 조회
  32. const board = await fetchBoard(code);
  33. if (!board || !board.data) {
  34. return notFound();
  35. }
  36. if (!board.data.isActive) {
  37. return forbidden();
  38. }
  39. const boardMeta = board.data.boardMeta;
  40. // 1:1 게시판은 로그인한 사용자만 접근 가능
  41. if (boardMeta.list.layout === BoardLayout.QnA && !await isAuthenticated()) {
  42. redirect('/login');
  43. }
  44. // 게시판 접근 권한 확인
  45. if (!await checkPermission(boardMeta.permission.boardAccess, board.data.boardManager)) {
  46. return <PermissionDenied _board={board.data} />;
  47. }
  48. query.page = Math.max(Number(query.page) || 1) as number;
  49. query.perPage = Math.max(Number(query.perPage) || (boardMeta.list.perPage || 10)) as number;
  50. query.prefix = (Number(query.prefix) || null) as number|undefined;
  51. query.sort = (Number(query.sort) || boardMeta.list.sort) as BoardSort|undefined;
  52. query.search = (Number(query.search) || PostSearchType.Subject) as PostSearchType;
  53. query.keyword = (query.keyword || '') as string|undefined;
  54. // 게시글 조회
  55. const boardPosts = await fetchPostList({
  56. boardID: board.data.id as number,
  57. boardCode: board.data.code as string,
  58. page: query.page as number,
  59. perPage: query.perPage as number,
  60. boardPrefixID: query.prefix as number|null|undefined,
  61. sort: query.sort as BoardSort|null|undefined,
  62. search: query.search as PostSearchType,
  63. keyword: query.keyword as string|null|undefined
  64. } as BoardPostsRequest);
  65. if (!boardPosts.success) {
  66. throwError(boardPosts);
  67. }
  68. return (
  69. <View _query={query} _board={board.data} _postList={boardPosts.data!} />
  70. );
  71. }